package com.thread;

import com.thread.start.Demo01;
import com.thread.start.JoinDemo02;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Description:
 *
 * @author jiangbang
 * @version 1.0
 * @date: 2018年01月11日
 * @since JDK 1.8
 */
public class MyDomeThread {

    public static void main(String[] args) throws InterruptedException {

        // 原始数据
		List<Integer> idList = new ArrayList<>();
		for (int i = 1; i <= 100; i++) {
            idList.add(i);
		}

        ExecutorService executorService  = Executors.newFixedThreadPool(3);
        List<Future<List<Integer>>> resultList = new ArrayList<Future<List<Integer>>>();

		// 创建10个任务并执行
		for (int i = 0; i < 10; i++) {
			// 使用ExecutorService执行Callable类型的任务，并将结果保存在future变量中
			Future<List<Integer>> future = executorService.submit(new ListThread(idList.subList(i * 10, (i + 1) * 10)));
			// 将任务执行结果存储到List中
			resultList.add(future);
		}

        List<Integer> idList2 = new ArrayList<>();

		// 遍历任务的结果
		for (Future<List<Integer>> fs : resultList) {
			try {
				while (!fs.isDone());// Future返回如果没有完成，则一直循环等待，直到Future返回完成
                idList2.addAll(fs.get());
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			} finally {
				// 启动一次顺序关闭，执行以前提交的任务，但不接受新任务
				executorService.shutdown();
			}
		}

        System.out.println(idList2);
    }



//        ExecutorService e = Executors.newCachedThreadPool();
//        ExecutorService e = Executors.newSingleThreadExecutor();
    // 第一种是可变大小线程池，按照任务数来分配线程，
    // 第二种是单线程池，相当于FixedThreadPool(1)
    // 第三种是固定大小线程池。
    // 然后运行
//        e.execute(new JoinDemo02());
//        e.execute(new JoinDemo02());

}
